package com.snpic.appaw.module.insure.service.image;

import com.amazonaws.services.s3.model.PutObjectResult;
import com.snpic.appaw.module.insure.config.S3Config;
import com.snpic.appaw.module.insure.controller.app.image.vo.VehicleLicenseStorageUploadRespVO;
import com.snpic.appaw.module.insure.service.s3.AmazonS3ObjectService;
import com.snpic.appaw.module.insure.util.s3.FileUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

import static com.snpic.appaw.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.snpic.appaw.module.insure.enums.ErrorCodeConstants.FILE_IS_EMPTY;
import static com.snpic.appaw.module.insure.enums.InsureConstant.S3_DIR_VEHICLE_LICENSE;

/**
 * @author JiJun
 * @date 2025/9/12 16:18
 * @修改时间 2025/9/12 16:18
 * @description 行驶证影像存储服务实现类，S3
 */
@Service
@Slf4j
public class VehicleLicenseStorageServiceImpl implements VehicleLicenseStorageService {

		@Resource
	private FileUtil fileUtil;

	@Resource
	private S3Config s3Config;

	@Resource
	private AmazonS3ObjectService amazonS3ObjectService;


	/**
	 * 上传行驶证影像
	 *
	 * @param file 上传的文件
	 * @return 上传响应
	 */
	@Override
	public VehicleLicenseStorageUploadRespVO upload(MultipartFile file) {
		VehicleLicenseStorageUploadRespVO respVO = new VehicleLicenseStorageUploadRespVO();
		// 检查文件是否为空
		if (file == null || file.isEmpty()) {
			throw exception(FILE_IS_EMPTY);
		}

		String uniqueFilename = fileUtil.getUniqueFilename(file,S3_DIR_VEHICLE_LICENSE);

		try {

			// 上传MultipartFile到S3
			PutObjectResult putObjectResult = amazonS3ObjectService.uploadMultipartFileToS3(s3Config.getBucketName(), uniqueFilename, file);

			// 构建返回结果
			respVO.setCode(0);
			respVO.setMessage("上传成功");
			respVO.setFilePath(uniqueFilename);
			log.info("行驶证图片上传成功，文件路径：{}", uniqueFilename);
		} catch (IOException e) {
			log.error("行驶证图片上传失败", e);
			respVO.setCode(2);
			respVO.setMessage("文件上传失败：");
		} catch (Exception e) {
			log.error("行驶证图片上传异常", e);
			respVO.setCode(3);
			respVO.setMessage("上传异常：");
		}
		return respVO;
	}


	/**
	 * 删除 S3 中的行驶证图片
	 *
	 * @param filePath S3 中的文件路径
	 * @return true：删除成功；false：删除失败（如文件不存在）
	 */
	@Override
	public Boolean delete(String filePath) {
		String bucketName = s3Config.getBucketName();
		try {
			amazonS3ObjectService.deleteObject(bucketName, filePath);
			log.info("S3 文件删除成功，bucket={}, filePath={}", bucketName, filePath);
			return true;
		} catch (Exception e) {
			// 处理 S3 服务端异常（如文件不存在、权限不足）
			log.error("S3 服务错误：删除文件失败，bucket={}, filePath={}", bucketName, filePath, e);
			return false; // 文件不存在时也返回 false，由业务层决定是否提示用户
		}
	}

	/**
	 * 获取 S3 中的行驶证图片 URL
	 *
	 * @param filePath S3 中的文件路径
	 * @return 图片 URL
	 */
	@Override
	public String getUrl(String filePath) {
		return amazonS3ObjectService.makeURL(s3Config.getBucketName(), filePath);
	}

}